package org.dllwh.utils.apache.poi.word;


import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName WordImage
 * @Description Word 图片相关
 * @Date 2025-10-24 14:01
 * @版本 V 1.0.1
 * @since JDK 17
 */
public final class WordImage {
    /**
     * 图片的格式
     */
    private static final Map<String, Integer> FORMAT_MAP = new HashMap<>();

    static {
        FORMAT_MAP.put("jpg", XWPFDocument.PICTURE_TYPE_JPEG);
        FORMAT_MAP.put("jpeg", XWPFDocument.PICTURE_TYPE_JPEG);
        FORMAT_MAP.put("emf", XWPFDocument.PICTURE_TYPE_EMF);
        FORMAT_MAP.put("wmf", XWPFDocument.PICTURE_TYPE_WMF);
        FORMAT_MAP.put("pict", XWPFDocument.PICTURE_TYPE_PICT);
        FORMAT_MAP.put("png", XWPFDocument.PICTURE_TYPE_PNG);
        FORMAT_MAP.put("dib", XWPFDocument.PICTURE_TYPE_DIB);
        FORMAT_MAP.put("gif", XWPFDocument.PICTURE_TYPE_GIF);
        FORMAT_MAP.put("tiff", XWPFDocument.PICTURE_TYPE_TIFF);
        FORMAT_MAP.put("eps", XWPFDocument.PICTURE_TYPE_EPS);
        FORMAT_MAP.put("bmp", XWPFDocument.PICTURE_TYPE_BMP);
        FORMAT_MAP.put("wpg", XWPFDocument.PICTURE_TYPE_WPG);
    }

    /**
     * 插入图片
     *
     * @param document  Word 文档对象
     * @param imagePath 图片路径（本地或网络）
     * @param width     图片宽度（单位：像素）
     * @param height    图片高度（单位：像素）
     */
    public static void insertImage(XWPFDocument document, String imagePath, int width, int height) throws Exception {
        // 获取图片格式
        int format = getImageFormat(imagePath);

        // 将图片写入文档
        BufferedImage image;

        // 判断是本地文件还是网络图片
        if (imagePath.startsWith("http")) {
            try (InputStream in = new URL(imagePath).openStream()) {
                image = ImageIO.read(in);
            }
        } else {
            image = ImgUtil.read(imagePath);
        }

        if (image == null) {
            throw new IOException("无法读取图片: " + imagePath);
        }

        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            ImageIO.write(image, String.valueOf(format), out);
            document.addPictureData(out.toByteArray(), format);
        }
    }

    /**
     * 插入图片
     *
     * @param table     表格对象
     * @param imagePath 图片路径（本地或网络）
     * @param rowIndex  行索引
     * @param colIndex  列索引
     * @param width     图片宽度（单位：像素）
     * @param height    图片高度（单位：像素）
     */
    public static void insertImage(XWPFTable table, String imagePath, int rowIndex, int colIndex, int width, int height) throws Exception {

    }

    /**
     * 根据图片地址获取图片格式
     *
     * @param imagePath 图片地址
     * @return 图片格式
     */
    private static int getImageFormat(String imagePath) {
        if (StrUtil.isBlank(imagePath)) {
            throw new IllegalArgumentException("图片路径不能为空");
        }

        String extension = FileNameUtil.getSuffix(imagePath);
        if (StrUtil.isBlank(extension)) {
            throw new IllegalArgumentException("图片格式不能为空: " + imagePath);
        }

        extension = extension.toLowerCase();

        Integer format = FORMAT_MAP.get(extension);
        if (format == null) {
            throw new UnsupportedOperationException("不支持的图片格式: " + extension);
        }

        return format;
    }

    /**
     * 获取图片尺寸
     *
     * @param filePath 图片文件
     * @return 图片尺寸
     */
    private static int[] getPictureSize(String filePath) throws IOException {
        BufferedImage image;

        // 判断是本地文件还是网络图片
        if (filePath.startsWith("http")) {
            try (InputStream in = new URL(filePath).openStream()) {
                image = ImageIO.read(in);
            }
        } else {
            image = ImgUtil.read(filePath);
        }

        if (image == null) {
            throw new IOException("无法读取图片: " + filePath);
        }

        // 获取图片原始尺寸（像素）
        return new int[]{image.getWidth(), image.getHeight()};
    }
}
